package com.cskaoyan.javase.oop2._1extends._5notice;

/**
 * @description: 继承中的限制/注意事项
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * Java中的继承,子类会得到父类的所有成员,但是:
 *      1.父类的私有成员能不能被继承?
 *          创建子类对象去访问父类的私有成员,如果直接访问是访问不到的,但是这里的访问不到有两种可能:
 *              a.干脆就没继承
 *              b.继承了,但是没权限
 *          我们通过在父类中写私有成员变量的get方法,发现可以获取该私有成员变量
 *              所以说明子类是继承了父类的私有成员,但是没有权限访问
 *
 *      2.父类的构造方法能不能继承?
 *          不能,构造器本来就是用来创建自身对象的,继承别人的构造器也没啥用
 *          构造器也不是类的成员
 *
 *      3.父类的静态成员能不能继承?
 *          能,子类是可以继承的
 *          但是我们讨论的继承,一般不考虑静态成员,只考虑普通成员
 *
 * 什么时候使用继承?
 *      继承的作用是为了复用成员,复用代码,提升程序的可维护性
 *      但是在使用继承时,不仅仅要考虑复用成员,更重要的是考虑两个类之间关系
 *      只有具有"is-a"关系的两个类才能使用继承
 *      千万不要为了复用成员,而滥用继承
 *
 *怎么辨别两个类具有"is-a"关系?
 *      最简单的方法是在开发之前,阅读需求文档,了解需求,了解业务,从而设计类的关系
 *
 *移动云/阿里云业务中,云服务器中
 *      云主机,裸金属,弹性伸缩
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son();
        //'a' has private access in 'com.cskaoyan.javase.oop2._1extends._5notice.Father'
        //System.out.println(s.a);
        //Cannot resolve symbol 'aaa'
        //System.out.println(s.aaa);
        System.out.println(s.getA());

        System.out.println(Father.b);
        System.out.println(Son.b);

        Father f = new Father();
        //f.a
        System.out.println(f.getA());
    }
}

class Father {
    private int a = 10;
    static String b = "xxx";

    //提供公共权限的a的get方法
    public int getA(){
        return a;
    }
}

class Son extends Father {

}
